package 内部类;
/*
类的内部成员之五：内部类
1. Java中允许将一个类A声明在另一个类B中，则类A就是内部类，类B就是外部类
2. 内部类的分类： 成员内部类（静态、非静态） VS 局部内部类(方法内、代码块内、构造器内)
 3. 成员内部类：一方面：作为外部类的成员
                     调用外部类的结构
                     可以被static修饰
                     可以被四种不同的权限修饰
               另一方面：作为一个类
                        类内可以定义属性、方法、构造器等
                        可以被final修饰，表示此类不能被继承，不使用可以被继承
                        可以被abstract修饰

4. 关注如下3个问题
   4.1 如何实例化成员内部类的对象
   4.2 如何在成员内部类区分外部类的结构
   4.3 开发中局部内部类的使用


 */
public class InnerClassTest {
    public static void main(String[] args) {
        //创建dog实例(静态的成员内部类)
        Person.Dog dog =new Person.Dog();
        dog.show();
        //创建Bird实例(非静态的成员内部类)
        Person person=new Person();//先对类进行实例化
        Person.Bird b =person.new Bird();
        b.sing();
    }

}
class Person{
    String name;
    int age;
    public void eat(){
        System.out.println("人，吃饭");
    }


    //非静态内部类
   static class Dog{
        String name;
        int age;
        public void show(){
            System.out.println("往往");
//           eat();//静态
        }
    }
    //静态内部类
     class Bird{
        String name;
        public Bird(){
        }
        public void sing(){
            System.out.println(Person.this.name);//调用Person当中name的属性
            System.out.println("我是一只鸟");
         Person.this.eat();//调用外部类的属性可以省略person.this.
        }
    }
    //局部内部类
    {class AA{}}
    public void method(){
        class BB{}
    }
    public Person(){
        class CC{}
    }
    //返回一个实现了COmparable接口的类的对象
    public Comparable getComparable(){
        //创建一个实现Comparable接口的类：局部内部类
//        class MyComparable implements Comparable {
//            @Override
//            public int compareTo(Object o) {
//                return 0;
//
//            }
//        }return new MyComparable();
        //    方式二
        return new Comparable() {
            @Override
            public int compareTo(Object o) {
                return 0;
            }
        };
    }




}
